<!doctype html>
<html lang="zh-CN">
<head><meta name="generator" content="Hexo 3.8.0">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=11,IE=10,IE=9,IE=8">
    <meta name="baidu-site-verification" content="dIcXMeY8Ya">
    
    <title>Perfetto for linux-使用 Perfetto 分析调度问题 | OSKernelLAB</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="keywords" content="gatieme, 成坚, 内核, linux, kernel">
    <meta name="description" content="内核杂谈">

    
    <link rel="alternative" href="/atom.xml" title="OSKernelLAB" type="application/atom+xml">
    
    
    <link rel="icon" href="/favicon.ico">
    
    <link rel="stylesheet" href="/css/style.css?v=1615735433116">
    <!--[if lt IE 9]>
    <script src="/js/html5.js"></script>
    <![endif]-->
    
<script>
    var _hmt = _hmt || [];
    (function() {
        var hm = document.createElement("script");
        hm.src="https://hm.baidu.com/hm.js?1a8f9a67050c5fdb4c73cbbc00124bd8"
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>


</head>
</html>
<body class="home">
    <!--[if lt IE 9]>
    <div class="browsehappy">
        当前网页 <strong>不支持</strong>
        你正在使用的浏览器. 为了正常的访问, 请 <a href="http://browsehappy.com/">升级你的浏览器</a>.
    </div>
    <![endif]-->

    <!-- 博客头部 -->
    <header class="header">
    <section class="container header-main">
        <div class="logo">
            <a href="/">
                <div class="cover">
                    <span class="name">OSKernelLAB</span>
                    <span class="description">OS内核实验室</span>
                </div>
            </a>
        </div>
        <div class="dropnav iconfont icon-nav" id="JELON__btnDropNav"></div>
        <ul class="menu hidden" id="JELON__menu">
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/" title="首页" class="iconfont icon-home">&nbsp;首页</a>
            </li>
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/archives/" title="归档" class="iconfont icon-archives">&nbsp;归档</a>
            </li>
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/lab/" title="实验室" class="iconfont icon-archives">&nbsp;实验室</a>
            </li>
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/navigation/" title="网址导航" class="iconfont icon-archives">&nbsp;网址导航</a>
            </li>
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/about/" title="关于" class="iconfont icon-staff">&nbsp;关于</a>
            </li>
            
            <li rel="/2020/11/21/2020/1121-0002-Perfetto_for_linux/index.html" class="item ">
                <a href="/comment/" title="留言" class="iconfont icon-comment">&nbsp;留言</a>
            </li>
            
        </ul>
        <div class="profile clearfix">
            <div class="feeds fl">
                
                
                <p class="links">
                    
                        <a href="https://github.com/gatieme" target="_blank">Github</a>
                        |
                    
                        <a href="https://github.com/gatieme/gatieme.github.io" target="_blank">Hosted by Github Pages</a>
                        
                    
                </p>
                <p class="sns">
                    
                        <a href="https://blog.csdn.net/gatieme" class="csdn" target="_blank"><b>■</b> CSDN 博客</a>
                    
                        <a href="https://www.facebook.com/gatieme" class="qqweibo" target="_blank"><b>■</b> Facebook</a>
                    
                    <a href="javascript: void(0);" class="wechat">
                        <b>■</b>
                        公众号
                        <span class="popover">
                            <img src="/img/wechat_mp.jpg" width="120" height="120" alt="我的微信订阅号">
                            <i class="arrow"></i>
                        </span>
                    </a>
                </p>
                
            </div>
            <div class="avatar fr">
                <img src="/img/gatieme.jpg" alt="avatar" title="Gatieme-(成坚)">
            </div>
        </div>
    </section>
</header>


    <!-- 博客正文 -->
    <div class="container body clearfix">
        <section class="content">
            <div class="content-main widget">
                <!-- 文章页 -->
<!-- 文章 -->
<article class="post article">
    <header class="text-center">
        <h3 class="post-title"><span>Perfetto for linux-使用 Perfetto 分析调度问题</span></h3>
    </header>
    <p class="post-meta text-center">
        gatieme 发表于
        <time datetime="2020-11-21T14:40:00.000Z">2020-11-21</time>
    </p>
    <div id="JELON__articlePostContent" class="post-content">
        <table>
<thead>
<tr>
<th style="text-align:center">CSDN</th>
<th style="text-align:center">GitHub</th>
<th style="text-align:center">Blog</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><a href="https://kernel.blog.csdn.net/article/details/110296324" target="_blank" rel="noopener">紫夜阑珊-青伶巷草</a></td>
<td style="text-align:center"><a href="https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/tools/perfetto" target="_blank" rel="noopener"><code>LDD-LinuxDeviceDrivers/study/debug/tools/perfetto</code></a></td>
<td style="text-align:center"><a href="https://gatieme.github.io/2020/11/21/2020/1121-0002-Perfetto_for_linux" target="_blank" rel="noopener">OS 内核实验室</a></td>
</tr>
</tbody>
</table>
<p><br></p>
<p><a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"></a></p>
<p>本作品采用<a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可, 转载请注明出处, 谢谢合作</p>
<p>因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦</p>
<p><br></p>
<h1 id="1-Perfetto-概述"><a href="#1-Perfetto-概述" class="headerlink" title="1 Perfetto 概述"></a>1 Perfetto 概述</h1><hr>
<h2 id="1-1-为什么需要-Perfetto"><a href="#1-1-为什么需要-Perfetto" class="headerlink" title="1.1 为什么需要 Perfetto"></a>1.1 为什么需要 Perfetto</h2><hr>
<p>Perfetto 工具是 Android 下一代全新的统一的 trace 收集和分析框架, 在 Android 9.0(API级别28)或更高版本的设备上, 可以使用 System Tracing 的 System App 在设备上记录系统跟踪, 可以抓取平台和app的 trace 信息</p>
<p><img src="https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/perfetto_ui_trace.png" alt="使用 prfetto UI 查看 trace 文件"></p>
<p>虽然 Perfetto 是用来取代 systrace 的, 但 systrace 由于历史原因也还会一直存在, 并且 Perfetto 抓取的 trace 文件也可以同样转换成 systrace 视图.</p>
<p>如果习惯用 systrace 的, 可以用 Perfetto UI 的 Open with legacy UI 转换成 systrace 视图来看</p>
<p><img src="https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/perfetto_leggcy_ui.png" alt="使用 prfetto legacy UI 查看 trace 文件"></p>
<blockquote>
<p>注意<br>【请知悉】</p>
<p>本文虽然是在介绍 perfetto 工具, 但是</p>
<ol>
<li>用 perfetto 进行数据分析, 数据是否会被传回 google 服务器, 未经考证;</li>
<li>perfetto 抓取的日志中的确包含机器的一些信息;</li>
<li>perfetto 的数据存储格式无法直接解析, 具体涉及的信息也未经剖析;<br>所以如果是涉密的数据(比如你在未发布的机器/服务器/开发板/手机等终端产品上抓取的日志),<br>没有数据证明, 该数据不会被收集分析.<br>因此如果设备或者数据涉及信息安全的相关内容, 请谨慎使用.<br>博主在此提醒, 如果因为不慎使用导致的问题, 本博主不承担任何责任.</li>
</ol>
<p>谢谢大家, 小弟在此不甚感激.</p>
</blockquote>
<h2 id="1-2-Perfetto-优点"><a href="#1-2-Perfetto-优点" class="headerlink" title="1.2 Perfetto 优点"></a>1.2 Perfetto 优点</h2><hr>
<ol>
<li>支持 Android 和 Linux 上的全系统跟踪, 可以在线抓取长时间(可达数小时)的 trace, 子系统<a href="https://perfetto.dev/docs/analysis/trace-processor" target="_blank" rel="noopener">跟踪处理器</a> 专门设计用于将数小时的跟踪数据有效地保存到本地中, 并基于流行的SQLite查询引擎公开SQL查询接口支持 SQL 查询. 这样就可以在后台开启, 让它一直抓取 trace 了, 特别适用于那种复现概率很低, 又比较严重的性能问题.</li>
</ol>
<ol start="2">
<li>Perfetto 具有很好的可扩展性, 它除了支持标准的 tracepoints(例如CPU调度信息, 内存信息等)之外, 还可以监听系统的多种信息, 比如 procfs 以及 sysfs 接口等; 还可以通过 atrace HAL 层扩展, 在 Android P当中, Google新增加了一个 atrace HAL 层, atrace 进程可以调用这个HAL的接口来获取当前的扩展信息, 比如添加用于记录电池和电量使用的统计信息, 程序的执行路径等. 相关代码可见 <a href="https://android-review.googlesource.com/c/platform/frameworks/native/+/770934" target="_blank" rel="noopener">Google 提交</a>, 这样如果需要扩展 tracepoints 的话, 就可以按照 graphic 的示例添加即可.</li>
</ol>
<ol start="3">
<li>提供全新的 <a href="https://ui.perfetto.dev/" target="_blank" rel="noopener">Perfetto UI 网站</a>, 用于打开的跟踪, 并通过浏览器在本地处理, 不需要任何服务器端交互. 可以在上面通过选取开关的方式, 自动生成抓取 trace 的命令, 同时可以打开 trace 文件. 另外还集成了几种预定义的 trace 分析统计工具, 详情可见它的 Metrics and auditors 选项</li>
</ol>
<blockquote>
<p>Perfetto 本身是一个框架, 关于它的架构和模块的详细介绍, 可以参考它的 <a href="https://perfetto.dev/docs/" target="_blank" rel="noopener">doc 网站</a>, 它的源码可以参考 Android Source Tree 的 /external/perfetto 目录, 里面有很多的tools, 配置和脚本等, 可以拿来直接使用.</p>
</blockquote>
<h1 id="2-Android-上使用-perfetto"><a href="#2-Android-上使用-perfetto" class="headerlink" title="2 Android 上使用 perfetto"></a>2 Android 上使用 perfetto</h1><hr>
<h2 id="2-1-使能-perfetto"><a href="#2-1-使能-perfetto" class="headerlink" title="2.1 使能 perfetto"></a>2.1 使能 perfetto</h2><hr>
<p>由于 <code>Perfetto</code> 有一套服务框架, 为了捕获跟踪, 需要运行traced(会话守护程序)和traced_probes(探测和ftrace-interop守护程序).</p>
<p>默认情况下, 这些服务是没有开启的, 可以看下手机上有没有这两个进程运行来确认这点.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell <span class="string">"ps -ef | grep -E "</span>traced|traced_probes<span class="string">" | grep -v grep"</span></span><br></pre></td></tr></table></figure>
<p>如果没有这两个服务在运行, 那么可以使用如下命令来启用 perfetto</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell setprop persist.traced.enable <span class="number">1</span></span><br></pre></td></tr></table></figure>
<h2 id="2-2-抓取-trace"><a href="#2-2-抓取-trace" class="headerlink" title="2.2 抓取 trace"></a>2.2 抓取 trace</h2><hr>
<p>跟 systrace 一样, Perfetto 为我们提供了两种方式来抓取 trace 日志.</p>
<ol>
<li><p>通过 <a href="https://ui.perfetto.dev/#!/" target="_blank" rel="noopener">Perfetto UI</a> 中的记录页面, 参照 <a href="https://perfetto.dev/docs/quickstart/android-tracing" target="_blank" rel="noopener">Quickstart: Record traces on Android</a>.</p>
</li>
<li><p>使用 <a href="https://perfetto.dev/docs/reference/perfetto-cli" target="_blank" rel="noopener">perfetto命令行</a> 界面.</p>
</li>
</ol>
<p>我们自然使用 perfetto CLI 命令行方式来抓取.</p>
<table>
<thead>
<tr>
<th style="text-align:center">参数使用</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">–out</td>
<td style="text-align:center">用来指定 trace 输出文件</td>
</tr>
<tr>
<td style="text-align:center">–config</td>
<td style="text-align:center">用来指定配置, 例如抓多长时间, 间隔多久把内存数据写回文件, 抓取哪些 tracepoints 等等, config 文件内容, 可以自己手动编写, 也可以用 Perfetto UI网站生成</td>
</tr>
</tbody>
</table>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace <span class="comment">//使用内置的test配置, 然后输出到/data/misc/perfetto-traces/trace</span></span><br></pre></td></tr></table></figure>
<p>另外在 Perfetto 里面默认集成了一个 test 配置, 可以使用如下命令抓取一个使用 test config 的 trace 文件</p>
<h1 id="3-服务器上使用-perfetto"><a href="#3-服务器上使用-perfetto" class="headerlink" title="3 服务器上使用 perfetto"></a>3 服务器上使用 perfetto</h1><hr>
<h2 id="3-1-编译-perfetto"><a href="#3-1-编译-perfetto" class="headerlink" title="3.1 编译 perfetto"></a>3.1 编译 perfetto</h2><hr>
<p>下载 perfetto 核心代码</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https:<span class="comment">//android.googlesource.com/platform/external/perfetto/ &amp;&amp; cd perfetto</span></span><br></pre></td></tr></table></figure>
<p>下载并提取构建依赖项：</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tools/install-build-deps</span><br></pre></td></tr></table></figure>
<p>如果脚本因SSL错误而失败, 请尝试以方式调用该脚本 <code>python3 tools/install-build-deps</code>, 或升级您的openssl库.</p>
<p>生成所有最常见的GN构建配置：</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tools/build_all_configs.py</span><br></pre></td></tr></table></figure>
<p>构建Linux跟踪二进制文件(在Linux上, 它使用密封的clang工具链, 作为步骤2的一部分下载)：</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tools/ninja -C out/linux_clang_release traced traced_probes perfetto</span><br></pre></td></tr></table></figure>
<p>使用tools/tmux下面的便捷脚本时, 此步骤是可选的.</p>
<h2 id="3-2-使用-perfetto"><a href="#3-2-使用-perfetto" class="headerlink" title="3.2 使用 perfetto"></a>3.2 使用 perfetto</h2><hr>
<p>perfetto 是一个命令行工具, 在shell环境下执行, 他依赖于系统中运行的的两个服务进程 traced 和 traced_probes 来完成工作.</p>
<p>Android 通过启用 perfetto 服务来自动运行 traced(会话守护程序)和traced_probes(探测和ftrace-interop守护程序).<br>但是 Linux 系统中我们必须手动将这两个服务启动起来.</p>
<h3 id="3-2-1-一键式-tmux-脚本"><a href="#3-2-1-一键式-tmux-脚本" class="headerlink" title="3.2.1 一键式 tmux 脚本"></a>3.2.1 一键式 tmux 脚本</h3><hr>
<p>perfetto 为我们提供了 tools/tmux 脚本来完成类似与 Android 上类似的工作, 帮我们启动服务进程, 并设置一个工作面板.</p>
<p>我们可以使用如下命令通过 tools/tmux 脚本来抓取 10S 调度的日志<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">OUT=out/linux_clang_release CONFIG=test/configs/scheduling.cfg tools/tmux -n</span><br></pre></td></tr></table></figure></p>
<blockquote>
<p>perfetto cli 工具运行时候, 需要制定 config 文件, perfetto 默认为我们提供了多个配置模板, 位于仓库路径下 test/configs 目录下.<br>上面我们使用的是默认提供的 scheduling 的配置, 我们也可以自定义 config 或者用 perfeto ui 生成 config.</p>
</blockquote>
<p>脚本首先将我们需要的服务程序和 perfetto CLI 工具及其依赖库都拷贝到了 TMP 目录下 <code>/tmp/perfetto.xxxxxx</code>.<br>然后使用 tmux 帮我们打开了一个有三个面板的 TMUX 窗口, 从上往下分别启动了: traced, traced_probes 和 perfetto 抓取日志的工作台.<br>在最底下的 perfetto 工作面板中, 已经为我们预先填好了抓取 perfetto 的命令, 我们只需要回车就可以抓取 10S 调度日志.</p>
<p><img src="https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/perfetto_run_tmux.gif" alt="使用 tmux 运行 perfetto"></p>
<blockquote>
<p>我们可以使用 Ctrl-B D 退出这个tmux会话<br>也可以使用 tmux attach -t demo, 来重新连接大这个 tmux 会话.<br>使用关闭它 tmux kill-session -t demo.<br>更过关于 tmux 的操作, 请参照博主的另外一篇博客 <a href="https://blog.csdn.net/gatieme/article/details/49301037" target="_blank" rel="noopener">linux下的终端利器—-tmux</a>.<br>注意请不要使用 tmux 这篇博客中提供的配置文件, 这篇博客中重新绑定了快捷键, 否则你可能需要重新修改 tmux 脚本或者配置文件.</p>
</blockquote>
<p>脚本会将跟踪到的日志信息以二进制的格式存在到的 protobuf 中, 参照 <a href="https://perfetto.dev/docs/reference/trace-packet-proto" target="_blank" rel="noopener">TracePacket</a></p>
<h3 id="3-2-2-手动运行服务"><a href="#3-2-2-手动运行服务" class="headerlink" title="3.2.2 手动运行服务"></a>3.2.2 手动运行服务</h3><hr>
<p>前面使用 tmux 运行了之后, 我们就清楚的知道启动了那些服务, 以及 perfetto 抓取的命令.</p>
<p>手动将服务后台启起来, 然后运行 perfetto, 指定 config, 抓取 trace 日志.</p>
<p>如下所示:</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">cd out/linux_clang_release</span><br><span class="line"></span><br><span class="line">./traced_probes &amp;</span><br><span class="line"></span><br><span class="line">./traced &amp;</span><br><span class="line"></span><br><span class="line">./perfetto --txt -c ../../test/configs/scheduling.cfg  -o trace</span><br></pre></td></tr></table></figure>
<h1 id="4-perfetto-的一些技巧"><a href="#4-perfetto-的一些技巧" class="headerlink" title="4 perfetto 的一些技巧"></a>4 perfetto 的一些技巧</h1><hr>
<h2 id="4-1-自定义Config"><a href="#4-1-自定义Config" class="headerlink" title="4.1 自定义Config"></a>4.1 自定义Config</h2><hr>
<p>目前最方便的配置文件生成方式是使用Perfetto UI 网站来帮助生成, 点击 Record new trace 会看到有很多的配置界面<br>选择想要的 tracepoints 之后 点击 Trace Command, 将命令内容拷贝出来直接在终端就可以执行.</p>
<p><img src="https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/perfetto_trace_command.png" alt="自定义 config"></p>
<h2 id="4-2-使用-SQL-查询和分析日志"><a href="#4-2-使用-SQL-查询和分析日志" class="headerlink" title="4.2 使用 SQL 查询和分析日志"></a>4.2 使用 SQL 查询和分析日志</h2><hr>
<p>子系统 TraceProcessor 基于 SQLite 为 Perfetto 提供了查询和分析数据的能力.<br>又作为独立的可执行文件提供: trace_processor.</p>
<p>关于这部分的详细信息可以参照 <a href="https://perfetto.dev/docs/quickstart/trace-analysis" target="_blank" rel="noopener">Quickstart: SQL-based analysis and trace-based metrics</a></p>
<h2 id="4-3-trace-格式转换工具"><a href="#4-3-trace-格式转换工具" class="headerlink" title="4.3 trace 格式转换工具"></a>4.3 trace 格式转换工具</h2><hr>
<p>Perfetto 提供了一个兼容的 UI 来打开 原来的 systrace, 参见 <a href="https://ui.perfetto.dev/assets/catapult_trace_viewer.html" target="_blank" rel="noopener">catapult_trace_viewer</a>.<br>不过毕竟是要替代 systrace 的, 因此使用起来有一丢丢问题, 而且也不能打开太的 systrace 文件.</p>
<p>不过 Perfetto 也提供了一些方法, 让你把你抓到的日志转换成 systrace 格式.</p>
<ul>
<li><p>提供的 traceconv 工具将 Perfetto 跟踪转换为其他跟踪格式.</p>
</li>
<li><p>点击 Perfetto 界面的 Legacy UI, 就会把你的日志转换成 systrace 格式并用 catapult_trace_viewer 打开. 你可以点击 save 把你的 systrace 日志保存下来.</p>
</li>
</ul>
<h1 id="5-参考资料"><a href="#5-参考资料" class="headerlink" title="5 参考资料"></a>5 参考资料</h1><hr>
<p><a href="https://www.jianshu.com/p/ab22238a9ab1" target="_blank" rel="noopener">Perfetto工具使用简介</a></p>
<p><a href="https://blog.csdn.net/sinat_20059415/article/details/106307905" target="_blank" rel="noopener">(两百五十七) 学习perfetto(二)——生成perfetto trace</a></p>
<p><a href="https://blog.csdn.net/zhendong_hu/article/details/103858660" target="_blank" rel="noopener">Perfetto使用</a></p>
<p><a href="https://medium.com/kayvan-kaseb/android-app-performance-analysis-with-perfetto-c8707d879abd" target="_blank" rel="noopener">android-app-performance-analysis-with-perfetto</a></p>
<p><a href="https://perfetto.dev/docs" target="_blank" rel="noopener">perfetto docs</a></p>
<p><a href="https://www.jianshu.com/p/143412da0081" target="_blank" rel="noopener">（七) 下篇 Android 性能优化 Perfetto 详细介绍</a></p>
<p><br></p>
<ul>
<li><p>本作品/博文 ( <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017</a> ), 由 <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">成坚(gatieme)</a> 创作.</p>
</li>
<li><p>采用<a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"></a><a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名<a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">成坚gatieme</a> ( 包含链接: <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">http://blog.csdn.net/gatieme</a> ), 不得用于商业目的.</p>
</li>
<li><p>基于本文修改后的作品务必以相同的许可发布. 如有任何疑问, 请与我联系.</p>
</li>
</ul>

    </div>
    <p class="eof">-- EOF --</p>
    <p class="post-meta">
        <span class="post-cat">分类：
            <a class="cat-link" href="/categories/内核探秘/">内核探秘</a>
        </span>
        <span class="post-tags">
            标签：
            
    
        <a href="/tags/linux/" title="linux">linux</a> / 
    
        <a href="/tags/debug/" title="debug">debug</a> / 
    
        <a href="/tags/scheduler/" title="scheduler">scheduler</a>
    

        </span>
    </p>
</article>
<!-- 分享按钮 -->

  <div class="article-share clearfix text-center">
    <div class="share-area">
      <span class="share-txt">分享到：</span>
      <a href="javascript: window.open('http://service.weibo.com/share/share.php?url=' + encodeURIComponent(location.href) + '&title=' + document.title + '&language=zh_cn');" class="share-icon weibo"></a>
      <a href="javascript: alert('请复制链接到微信并发送');" class="share-icon wechat"></a>
      <a href="javascript: window.open('http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + encodeURIComponent(location.href) + '&title=' + document.title);" class="share-icon qqzone"></a>
      <a href="javascript: window.open('http://connect.qq.com/widget/shareqq/index.html?url=' + encodeURIComponent(location.href) + '&desc=Gatieme个人博客&title=' + document.title + '&callback=' + encodeURIComponent(location.href));" class="share-icon qq"></a>
      <a href="javascript: window.open('http://shuo.douban.com/!service/share?href=' + encodeURIComponent(location.href) + '&name=' + document.title + '&text=' + document.title);" class="share-icon douban"></a>
    </div>
  </div>



<!-- 上一篇/下一篇 -->

<div class="article-nav clearfix">
    
    <span class="prev fl">
        上一篇<br>
        <a href="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/">
            
                Intel CPU 上使用 pmu-tools 进行 TopDown 分析
            
        </a>
    </span>
    

    
    <span class="next fr">
        下一篇<br>
        <a href="/2020/11/21/2020/1121-0001-Systrace_for_linux/">
            
                Systrace for Linux-使用 systrace 分析 linux &amp; android 的调度问题
            
        </a>
    </span>
    
</div>

<!-- 文章评论 -->

  <script src="/js/comment.js?v=1615735432594"></script>
  <div id="comments" class="comment">
    <!--
    <div class="sign-bar">
      GitHub 已登录!
      <span class="sign-link">登出</span>
    </div>
    <section class="box">
      <div class="com-avatar"><img src="/img/gatieme.jpg" alt="avatar"></div>
      <div class="com-text">
        <div class="main">
          <textarea class="text-area-edited show" placeholder="欢迎评论！"></textarea>
          <div class="text-area-preview"></div>
        </div>
        <div class="switch">
          <div class="switch-item on">编辑</div>
          <div class="switch-item">预览</div>
        </div>
        <div class="button">提交</div>
      </div>
    </section>
    <section class="tips">注：评论支持 markdown 语法！</section>
    <section class="list-wrap">
      <ul class="list">
        <li>
          <div class="user-avatar">
            <a href="/">
              <img src="/img/gatieme.jpg" alt="user-avatar">
            </a>
          </div>
          <div class="user-comment">
            <div class="user-comment-header">
              <span class="post-name">张德龙</span>
              <span class="post-time">2017年12月12日</span>
              <span class="like liked">已赞</span>
              <span class="like-num">2</span>
            </div>
            <div class="user-comment-body">333333</div>
          </div>
        </li>
        <li>
          <div class="user-avatar">
            <a href="/">
              <img src="/img/gatieme.jpg" alt="user-avatar">
            </a>
          </div>
          <div class="user-comment">
            <div class="user-comment-header">
              <span class="post-name">刘德华</span>
              <span class="post-time">2017年12月12日</span>
              <span class="like">点赞</span>
              <span class="like-num">2</span>
            </div>
            <div class="user-comment-body">vvvvv</div>
          </div>
        </li>
      </ul>
      <div class="page-nav">
        <a href="javascript: void(0);" class="item">1</a>
        <a href="javascript: void(0);" class="item">2</a>
        <a href="javascript: void(0);" class="item current">3</a>
      </div>
    </section>
    -->
  </div>
  <script>
  JELON.Comment({
    container: 'comments',
    label: '2020/1121-0002-Perfetto_for_linux' || '2020/11/21/2020/1121-0002-Perfetto_for_linux/',
    owner: 'gatieme',
    repo: 'blog_comments',
    clientId: 'cf796c25fcf4369b9295',
    clientSecret: 'c2ecfa50b9914a8fc9655ede7c9e6cf2ff84a70c'
  });
  </script>




            </div>
        </section>
        <!-- 侧栏部分 -->
<aside class="sidebar">
    
    <section class="widget">
        <h3 class="widget-hd"><strong>文章搜索</strong></h3>
        <div class="search-form">
  <form id="searchForm" method="GET" action="https://www.google.com/search" ectype="application/x-www-form-urlencoded" target="_blank" autocomplete="false" onsubmit="javascript: return false;">
    <input id="searchKeyword" type="text" class="form-control" placeholder="输入关键字搜索" autocomplete="false">
    <input id="searchKeywordHidden" type="hidden" name="q">
    <input id="searchButton" class="btn" type="submit" value="搜索">
  </form>
</div>

    </section>
    

    <section class="widget">
        <h3 class="widget-hd"><strong>文章分类</strong></h3>
        <!-- 文章分类 -->
<ul class="widget-bd">
    
    <li>
        <a href="/categories/linux/">linux</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/hexo/">hexo</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/qemu/">qemu</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/debug/">debug</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/编程珠玑/">编程珠玑</a>
        <span class="badge">(7)</span>
    </li>
    
    <li>
        <a href="/categories/技术积累/">技术积累</a>
        <span class="badge">(3)</span>
    </li>
    
    <li>
        <a href="/categories/内核探秘/">内核探秘</a>
        <span class="badge">(3)</span>
    </li>
    
</ul>
    </section>

    
    <section class="widget">
        <h3 class="widget-hd"><strong>热门标签</strong></h3>
        <!-- 文章标签 -->
<div class="widget-bd tag-wrap">
  
    <a class="tag-item" href="/tags/linux/" title="linux">linux (10)</a>
  
    <a class="tag-item" href="/tags/debug/" title="debug">debug (6)</a>
  
    <a class="tag-item" href="/tags/tools/" title="tools">tools (4)</a>
  
    <a class="tag-item" href="/tags/scheduler/" title="scheduler">scheduler (3)</a>
  
    <a class="tag-item" href="/tags/hexo/" title="hexo">hexo (2)</a>
  
    <a class="tag-item" href="/tags/blog/" title="blog">blog (2)</a>
  
    <a class="tag-item" href="/tags/qemu/" title="qemu">qemu (1)</a>
  
    <a class="tag-item" href="/tags/topdown/" title="topdown">topdown (1)</a>
  
    <a class="tag-item" href="/tags/kernel/" title="kernel">kernel (1)</a>
  
</div>
    </section>
    

    

    
    <!-- 友情链接 -->
    <section class="widget">
        <h3 class="widget-hd"><strong>友情链接</strong></h3>
        <!-- 文章分类 -->
<ul class="widget-bd">
    
        <li>
            <a href="https://blog.csdn.net/gatieme" target="_blank" title="我的 CSDN 博客">CSDN--紫夜阑珊-青伶巷草</a>
        </li>
    
        <li>
            <a href="https://xydh.fun/gatieme" target="_blank" title="我的炫猿导航主页">炫猿导航</a>
        </li>
    
        <li>
            <a href="https://jelon.info" target="_blank" title="Jelon 的博客">Jelon 的博客</a>
        </li>
    
</ul>
    </section>
    
</aside>
<!-- / 侧栏部分 -->
    </div>

    <!-- 博客底部 -->
    <footer class="footer">
    &copy;
    
        2014-2021
    

    <a href="/">紫夜阑珊-青伶巷草</a>
</footer>
<div class="back-to-top" id="JELON__backToTop" title="返回顶部">返回顶部</div>

    <!--博客js脚本 -->
    <!-- 这里放网站js脚本 -->
<script src="/js/main.js?v=1615735433125"></script>

</body>
</html>
